home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekikoh Dennoh Club 1
/
Gekikoh Dennoh Club Vol. 1 (Japan).7z
/
Gekikoh Dennoh Club Vol. 1 (Japan) (Track 1).bin
/
tools
/
xb
/
xbfnc.doc
< prev
next >
Wrap
Text File
|
1996-12-08
|
19KB
|
735 lines
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
外部関数とそのライブラリについてのドキュメント
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
ぺけ-BASICには、以下の5つの外部関数のファイルが付属しています。
1.DOSFNC.FNC DOS CALL 関係
2.IOCSFNC.FNC IOCS CALL 関係
3.LZHFNC.FNC LZH 形式の圧縮ファイルを展開
4.RASTER.FNC ラスタスクロールなどの特殊効果
5.SPDEF.FNC スプライトをファイル名から定義
それぞれの関数ファイルごとに解説します。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
1.DOSFNC.FNC
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
str getenv()
int setenv()
int _system()
int drvctrl()
void chgdir()
str curdir()
int filesnum()
int files()
の8つの関数が含まれています。
/*--------------------------------------------------------------------
str getenv( ENV;str )
/*--------------------------------------------------------------------
環境変数の内容を得る。
** ** ** ** ** ** ** ** **
ENV : 環境変数名
/*--------------------------------------------------------------------
int setenv( ENV;str {, SETLINE;str} )
/*--------------------------------------------------------------------
環境変数に文字列を設定する。
** ** ** ** ** ** ** ** **
ENV : 環境変数名
SETLINE : 設定する文字列
省略した場合、指定の環境変数を消去する
返り値 = 0 : 正常設定
< 0 : 異常終了
/*--------------------------------------------------------------------
int _system( COMLINE;str )
/*--------------------------------------------------------------------
COMLINE を command.x に渡して子プロセスとして起動する。
** ** ** ** ** ** ** ** **
COMLINE : コマンドの文字列
返り値 : 終了コード
** ** ** ** ** ** ** ** **
command.x がパスの通ったディレクトリに存在しなければいけません。
COMLINE として、'copy', 'del' 等の内部コマンドも使えます。
BAStoC 時には、stdlib.h の system() 関数 に置き換えられます。
/*--------------------------------------------------------------------
int drvctrl( COM;int {, DRVNAME;str } )
/*--------------------------------------------------------------------
ドライブの状態をチェック・設定する。
** ** ** ** ** ** ** ** **
COM =-1 : カレントドライブの値を返す (0=A:, 1=B:, ...) (DRVNAME は意味無し)
0 : 状態チェック
1 : イジェクト ( ハードディスクの時はシッピング?)
2 : イジェクト禁止
3 : イジェクト許可
4 : ディスクがセットされていない時にLED点滅
5 : ディスクがセットされていない時にLED消灯
6 : カレントドライブの変更
7 : メディアバイトを返す
DRVNAME : ドライブ名を "A:" の形で指定
省略した場合、カレントドライブ
COM = 0 の返り値:
bit 7 : LED点滅
bit 6 : イジェクト禁止
bit 5 : バッファ有り
bit 4 : ユーザーによるイジェクト禁止
bit 3 : ライトプロテクト
bit 2 : ノットレディ
bit 1 : メディア挿入
bit 0 : 誤挿入
COM = 1,2,3,4 の返り値:
>= 0 : 正常終了 (設定後のメディアの状態)
< 0 : エラー
** ** ** ** ** ** ** ** **
メディアバイト:
$f4 : DAT (SCSI)
$f5 : CD-ROM (SCSI)
$f6 : MO (SCSI)
$f7 : ハードディスク (SCSI)
$f8 : ハードディスク
$f9 : RAM DISK
$fa : 2HD (1.44MB)
$fb : 2DD (640KB)
$fc : 2DD (720KB)
$fd : 2HC (1MB)
$fe : 2HD (1MB)
/*--------------------------------------------------------------------
void chgdir( DIR;str )
/*--------------------------------------------------------------------
カレントディレクトリを変更する。
** ** ** ** ** ** ** ** **
DIR : ディレクトリ名
/*--------------------------------------------------------------------
str curdir( {DRV;str} )
/*--------------------------------------------------------------------
カレントディレクトリを返す。
** ** ** ** ** ** ** ** **
DRV : "A:" の形で指定したドライブのカレントディレクトリを返す。
省略した場合、カレントドライブが対象となる。
/*--------------------------------------------------------------------
int filesnum( FILENAME;str, ATTRIB;int )
/*--------------------------------------------------------------------
指定のファイル名とアトリビュートに一致するファイルの個数を返す。
** ** ** ** ** ** ** ** **
FILENAME : ファイル名。ワイルドカードも使用可。
ATTRIB : アトリビュート
/*--------------------------------------------------------------------
int files( FILENAME;str, ATTRIB;int,NAMES();str,
SIZES();int, TIMES();int, ATTRS();char )
/*--------------------------------------------------------------------
指定のファイル名とアトリビュートに一致するファイルの情報を配列に展開
する。
** ** ** ** ** ** ** ** **
FILENAME : ファイル名。ワイルドカードも使用可。
ATTRIB : アトリビュート
NAMES : ファイル名の格納先
SIZES : ファイルサイズ
TIMES : タイムスタンプ
ATTRS : アトリビュート
4つの配列は、要素の個数を同じくしておかないといけません。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
2.IOCSFNC.FNC
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
int bpeek()
int wpeek()
int lpeek()
void bpoke()
void wpoke()
void lpoke()
int iocs()
int _arp()
int _vrp()
の9つの関数が含まれています。
なお、bpoke(), wpoke(), lpoke(), _arp() の仕様については、EXEC.FNC
( Oh!X '95年10月号掲載 ) を参考にさせていただきました。
/*--------------------------------------------------------------------
int bpeek( ADR;int )
int wpeek( ADR;int )
int lpeek( ADR;int )
/*--------------------------------------------------------------------
指定アドレスのメモリを読み出す。
bpeek() はバイト単位、wpeek() はワード単位、lpeek() はロングワード単
位で読み出す。
** ** ** ** ** ** ** ** **
ADR : アドレス
wpeek(), lpeek() で奇数アドレスを指定するとエラー
/*--------------------------------------------------------------------
void bpoke( ADR;int, VAR1;int {, VAR2;int, ... , VAR9;int } )
void wpoke( ADR;int, VAR1;int {, VAR2;int, ... , VAR9;int } )
void lpoke( ADR;int, VAR1;int {, VAR2;int, ... , VAR9;int } )
/*--------------------------------------------------------------------
指定アドレスのメモリに値を書き込む。
bpoke() はバイト単位、wpoke() はワード単位、lpoke() はロングワード単
位で書き込む。
最大 9 個まで連続に書き込むことができる。
** ** ** ** ** ** ** ** **
ADR : アドレス
wpoke(), lpoke() で奇数アドレスを指定するとエラー
VAR1, ... VAR9 : データ
** ** ** ** ** ** ** ** **
不用意な使い方をすると、暴走・システムの破壊などの取り返しのつかない
ことも起き得る関数なので、注意して下さい。
/*--------------------------------------------------------------------
int iocs( IOCS_CALL;int, {d1;int, d2;int,
d3;int, d4;int, d5;int, a1(), a2()} )
/*--------------------------------------------------------------------
IOCS CALL を呼び出す。
** ** ** ** ** ** ** ** **
IOCS_CALL : IOCS CALL 番号
d1-d5 : 指定のレジスタにセットされる値
a1/a2 : 数値型の配列名。データ部分の先頭が a1/a2 にセットされる
** ** ** ** ** ** ** ** **
IOCS_CALL 以外は省略可能です。
不用意な使い方をすると、暴走・システムの破壊などの取り返しのつかない
ことも起き得る関数なので、注意して下さい。
/*--------------------------------------------------------------------
int _arp( DIM )
/*--------------------------------------------------------------------
指定の配列のデータ部分の先頭アドレスを返します。
** ** ** ** ** ** ** ** **
DIM : 1 or 2 次元の配列名(型はいずれでも良い)
/*--------------------------------------------------------------------
int _vrp( VAR )
/*--------------------------------------------------------------------
指定の変数のポインタを返す。
** ** ** ** ** ** ** ** **
VAR : 変数名(型はいずれでも良い)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
3.LZHFNC.FNC
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
int lzh_extend()
の1つの関数が含まれています。
/*--------------------------------------------------------------------
int lzh_extend( FILENAME;str, BUF() )
/*--------------------------------------------------------------------
.LZH 形式の圧縮ファイルを配列上に展開する。
** ** ** ** ** ** ** ** **
FILENAME : 展開する圧縮ファイル名
拡張子は省略不可能
BUF() : 展開先の配列名
次元は1または2次元、型は int, char, float のいずれも可
** ** ** ** ** ** ** ** **
展開されるファイルは、アーカイブの先頭のファイルだけである。
BASICの外部関数として使っている時は、指定の配列より大きなファイ
ルを展開しようとすればエラーを発行しますが、ライブラリは展開先の大きさ
などおかまいなく展開してしまいます。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
4.RASTER.FNC
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
void v_priority()
int v_special()
void v_disp()
int ras_scroll_set()
int ras_scroll_stat()
void ras_home()
の6つの関数が含まれています。
{} で囲ってある引き数は省略可能。
/*--------------------------------------------------------------------
void v_priority( STG;str, GRAPH;str )
/*--------------------------------------------------------------------
テキスト・スプライト・グラフィックの間と、グラフィック0~3の間のプ
ライオリティを変更する。
** ** ** ** ** ** ** ** **
STG : テキスト・スプライト・グラフィックの間のプライオリティの指定
文字 S,T,G の順番で指定する。先に書いたものの方が優先順位は高い
例: TEXT > GRAPH > SPRITE => "TGS"
GRAPH : グラフィック0~3の間のプライオリティの指定
文字 0,1,2,3 の順番で指定する。先に書いたものの方が優先順位は高い
例: G0 > G3 > G1 > G2 => "0312"
** ** ** ** ** ** ** ** **
ともに、同じ面を2つ以上指定するとエラーとなる。
/*--------------------------------------------------------------------
int v_special( MD;int )
/*--------------------------------------------------------------------
ビデオコントローラの特殊表示機能、具体的に半透明と特殊プライオリティ
を制御する。
** ** ** ** ** ** ** ** **
MD : 動作を指定
MD = -1 : 今の状態を返す ( 0 ~ 8 )
= 0 : 特殊表示機能を使用しない
= 1 ~ 7 : ベースページとそれぞれ指定の面との半透明動作を行う。
1 : テキストパレットの0の色
2 : テキスト
3 : セカンドページ
4 : テキスト+セカンドページ
5 : テキスト +テレビ/ビデオ
6 : セカンドページ+テレビ/ビデオ
7 : テキスト+セカンドページ+テレビ/ビデオ
= 8 : 特殊プライオリティ
** ** ** ** ** ** ** ** **
ベースページ : グラフィックのプライオリティの最も高い面
セカンドページ : グラフィックのプライオリティの2番目に高い面
テキスト : スプライト、BGも含む、グラフィックよりプラ
イオリティの低い面
/*--------------------------------------------------------------------
void v_disp( {MD;int} )
/*--------------------------------------------------------------------
垂直帰線・表示期間を待つ
** ** ** ** ** ** ** ** **
MD : どちらを待つか指定
= 0 : 垂直帰線期間を待つ
<> 0 : 垂直表示期間を待つ
省略した場合、垂直帰線期間を待つ
/*--------------------------------------------------------------------
int ras_scroll_set( MD;int, RAS_DAT(,);int, PAGES;int,
RASTERS;int, FIRST_RASTER;int)
/*--------------------------------------------------------------------
ラスタスクロール用のデータをセット
** ** ** ** ** ** ** ** **
MD : ラスタスクロールさせる面を選ぶ
MD = 0: BG0 (横方向のみ)
1: BG1 (横方向のみ)
2: BG0 (縦横)
3: BG1 (縦横)
4: GRAPH0
5: TEXT
6: BG0 (縦横、差分)
7: BG1 (縦横、差分)
dim RAS_DAT( PAGES, RASTERS ) : ラスタスクロール用のデータ
PAGES : 最大ページ番号
RASTERS : 1ページ当たりのラスタ数 - 1
省略時には、RAS_DAT(,) の第1添え字、第2添え字の最大がそれぞれ
セットされる。
コンパイルの時には省略不可能。
FIRST_RASTER : スクロール(割り込み)開始ラスタ番号
ラスタの本数は 15kHz のとき 260 本
31kHz のとき 568 本なので,
FIRST_RASTER + RASTERS がその値を越えないよう注意
省略時には0と見なす。
** ** ** ** ** ** ** ** **
ラスタスクロール用のデータ RAS_DAT( PAGES, RASTERS ) は次のような形
式になっています。
RAS_DAT(n,m) = n ページ目の ( FIRST_RASTER + m ) 番目のラスタ表示時に
スクロールレジスタにセットされる値。
MD = 0,1,4,5 のときは、X 方向のスクロールレジスタにセットされる値で
す。
MD = 2,3 のときは、x,y をそれぞれ X,Y スクロールレジスタにセットされ
る値だとすると、RAS_DAT(n,m) = x * &h10000 + y となります。
MD = 6,7 のときは、前のラスタのデータからの差分で与えます。すなわち、
RAS_DAT(n,m) = dx * &h10000 + dy
dx, dy : 0 ~ &h3ff
** ** ** ** ** ** ** ** **
X-BASICやぺけ-BASICでラスタスクロールを実行中に、CTRL+C
で実行を止めると、ラスタスクロールも止まります。
コンパイルする時には、次の2点を守って下さい。
1:ras_scroll_set() の第3・4パラメータは省略不可能
2:BAStoC で生成したCのソースの、b_exit(); の直前に
ras_scroll_exit(); を『必ず』加える。
ras_scroll_exit() は、書き替えたベクタを元に戻したり、割り込みを解除
したりといった後始末を行う関数ですから、もし実行しないまま終了すると、
以降のアプリケーションの実行に支障が出ます。
また、実行中に INTERRUPT で ABORT すると、ras_scroll_exit() を通らな
いまま終了してしまいます。
/*--------------------------------------------------------------------
int ras_scroll_stat( COM;int {, FIRST_PAGE;int,
LAST_PAGE;int, LOOPS;int} )
/*--------------------------------------------------------------------
ラスタスクロールをコントロールや、状態を獲得を行う。
** ** ** ** ** ** ** ** **
COM : コマンド
COM = -1 :状態を得る。
返り値: > 0 : 残りループ回数
= 0 : 無限ループ
< 0 : ラスタスクロール終了
COM = 0 : ラスタスクロールを止めて、データをリセットする
別のデータをセットし直す前は、必ずこの命令を行う
COM = 1 : ras_scroll_set() によって与えられてデータにしたがって
ラスタスクロール開始
COM = -1,0 の時、残りのパラメータは意味無し
COM = 1 の時。
FIRST_PAGE : 開始ページ
LAST_PAGE : 終了ページ
ページデータの記述は ras_scroll_set() 参照
省略時には、先頭ページ (=0) と末尾ページ (= ras_scroll_set() の PAGES)
がそれぞれセットされる。
LOOPS : ループ回数
= 0 : 無限ループ
> 0 : その回数のループ
省略時には 0 = 無限ループと見なす
/*--------------------------------------------------------------------
void ras_home( X;int {, Y;int} )
/*--------------------------------------------------------------------
ラスタスクロールに対応した、ras_scroll_set() の MD で指定した面の左
上の座標の設定を行う(本来の bg_scroll(), home() などは無効となるので
注意)。
** ** ** ** ** ** ** ** **
X,Y : セットされる x,y 座標
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
5.SPDEF.FNC
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
int spfile_def()
int palfile_def()
の2つの関数が含まれています。
/*--------------------------------------------------------------------
int spfile_def( FILENAME;str, SP_NO;int )
/*--------------------------------------------------------------------
スプライトデータの収められたファイルから、スプライトを定義する。
** ** ** ** ** ** ** ** **
FILENAME : スプライトデータの収められたファイル名
SP_NO : 定義を始めるスプライト番号 ( 0 ~ 255 )
** ** ** ** ** ** ** ** **
ファイルの形式は以下の通り。
オフセット
+&h00 SP_NO 番目のスプライトデータ
+&h80 SP_NO + 1 番目のスプライトデータ
: : :
各々のスプライトデータは、1パタン当たり 16x16 ドットの大きさで、PCG
エリアにそのまま書き込める形式になっている。
/*--------------------------------------------------------------------
int palfile_def( FILENAME;str, PAL_NO;int )
/*--------------------------------------------------------------------
パレットデータの収められたファイルから、パレットを定義する。
** ** ** ** ** ** ** ** **
FILENAME : パレットデータの収められたファイル名
PAL_NO : 定義を始めるパレット番号 ( 0 ~ 15 )
** ** ** ** ** ** ** ** **
ファイルの形式は以下の通り。
オフセット
+&h00 PAL_NO 番目のパレットデータ
+&h20 PAL_NO + 1 番目のパレットデータ
: : :
各々のパレットデータは、
オフセット
+&h00 色コード 0 の色データ
+&h02 色コード 1 の色データ
:
+&h1e 色コード 15 の色データ
なお、0 番目のパレットデータはテキストパレットと共用である。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
独り言……でもみんなに聞いてほしいな
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
事の発端は、Oh!X '94年11月号の 48ページの下にある小コラム「外部関数
の集大成を」です。内容は、「外部関数はユーザーのアイデア次第でどんどん
拡張していくことができます。理論上はほとんど不可能なことはありません」
「そろそろX-BASICの集大成的なものをまとめる時機にきているのかも
しれません」という二文に集約されていると言っていいでしょう。
これを読んですっかり共感した中谷秀洋は、その後このことをすっかり忘れ
てしまいました……終わり。
このままでは本当に終わってしまいますが、後から勘定したら、ちょうどこ
のコラムを読んだ半月後から ぺけ-BASICを作り始めるのですから、完全
に忘れ去っていたわけではないようです。
それからおよそ半年。ぺけ-BASICの ver.0.01 を公開し、さあて、こ
いつをどう展開しようかと考え込んだ中谷の頭をよぎったのが、「ラスタスク
ロールの外部関数」です。
それが僕のオリジナルの考えでないことも一緒に思い出したので、Oh!X を
ひっくり返してようやく当のコラムを見つけ出したのでした。その時、むくむ
くと次のような野望が頭をもたげてきたのです。
「ぺけ-BASICなら『X-BASICの集大成』とやらの、きっかけなり核
なりになれるんでないかい?」
これまで Oh!X や電脳倶楽部等で発表されてきた外部関数は、お世辞にも広
くたくさんの人に使ってもらえているとは言えないでしょう。その理由はいく
つかあると思いますが、「他のみんなが持っているとは限らない」「X-BA
SICの遅さを補うための関数であるがゆえ、特殊な用途にしか向かない」の
二つが双壁ではないでしょうか。
ところで拙作ぺけ-BASICは、X-BASICでどうにもならなかったこ
とがなんとかなる程度の実行速度を持っています。また、ぺけ-BASICに
外部関数を付属させるという格好を取れば、少なくとも ぺけ-BASICを持
っている人は全員、その外部関数も持っていることになります。
当たり前ですが、それらの外部関数が全て中谷の作ったものである必要なん
てどこにもありません。今まで発表されてきた外部関数達にも良い物はたくさ
んあります。それらの作者の方々の協力が得られれば、自然『X-BASIC
の集大成』は実現してしまうでしょう。
今回の外部関数群は、この野望の実現のためにはまだまだ力不足で、ひいき
目に見てやって、ようやく第一歩目というところが関の山です。
こういう事を考えている人間がいる、という事を知ってもらいたい。賛同し
てくれる方がいるかもしれないし、いないかもしれない。一つ確実なことは、
一人で始めることが出来たとしても、一人で続けることは出来ないだろうとい
う事だけです。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
平成 7 年 6 月 16 日
中谷 秀洋
でんでんネット DEN1608 ( AKSTN. )
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━